package it.csi.finregio.finreges.client.services;

import it.crp.crparch.web.struts.service.CRPStrutsService;
import it.crp.crparch.web.struts.service.WebServiceException;
import it.crp.exception.ServiceException;
import it.crp.logger.PrdLoggerFactory;
import it.csi.finregio.finreges.client.ServiceLocator;
import it.csi.finregio.finreges.dto.Direzione;
import it.csi.finregio.finreges.dto.Ente;
import it.csi.finregio.finreges.dto.EnteScheda;
import it.csi.finregio.finreges.dto.Settore;
import it.csi.finregio.finreges.integration.FinregioService;
import it.csi.finregio.finreges.presentation.form.EntiSchedaContainer;
import it.csi.finregio.finreges.presentation.form.SchedaForm;

import java.util.ArrayList;
import java.util.Collection;
import java.util.StringTokenizer;

import org.apache.log4j.Logger;
import org.apache.struts.action.ActionForm;

public class InserisciInfoAssEnteService implements CRPStrutsService {

	private Logger log = PrdLoggerFactory.getInstance().getLogger("finreges");

	public Object execute(ActionForm form) throws WebServiceException {
		SchedaForm sf = (SchedaForm) form;
		int mode = Integer.parseInt(sf.getModalitaInserimento());
		switch (mode) {
		case SchedaForm.STANDARD:
			// Carico i dati di direzione-settore-assessorato
			inserimentoStandard_AltriEnti(sf,mode);
			break;
		case SchedaForm.NON_STANDARD:
			try {
				FinregioService fs = new ServiceLocator().getFinRegioService();
				Ente ente = fs.getEnteByPK(sf.getIdEnte());
				if (sf.getProgressivoDirezione() != null
						&& sf.getProgressivoDirezione().indexOf("$") != -1) {
					StringTokenizer stDirezione = new StringTokenizer(sf
							.getProgressivoDirezione(), "$");
					while (stDirezione.hasMoreTokens()) {
						String prog = stDirezione.nextToken();
						Direzione dir = fs.getDirezioneByProgressivo(prog);
						// listaDirezioni.add(dir);
						addRow(sf, ente, dir, null,mode);
					}
				} else {
					Direzione dir = fs.getDirezioneByProgressivo(sf
							.getProgressivoDirezione());
					addRow(sf, ente, dir, null, mode);
				}
				if (sf.getProgressivoSettore() != null
						&& sf.getProgressivoSettore().indexOf("$") != -1) {
					// Collection listaSettori = new ArrayList();
					StringTokenizer stSettore = new StringTokenizer(sf
							.getProgressivoSettore(), "$");
					while (stSettore.hasMoreTokens()) {
						String prog = stSettore.nextToken();
						Settore s = fs.getSettoreByProgressivo(prog);
						// listaSettori.add(s);
						addRow(sf, ente, null, s,mode);
					}
				} else {
					Settore set = fs.getSettoreByProgressivo(sf
							.getProgressivoSettore());
					addRow(sf, ente, null, set,mode);
				}
				// for (Iterator iterator = listaDirezioni.iterator(); iterator
				// .hasNext();) {
				// Direzione dir = (Direzione) iterator.next();
				// addRow(sf,ente, dir, null);
				// }
				// for (Iterator iterator = listaSettori.iterator(); iterator
				// .hasNext();) {
				// Settore s = (Settore) iterator.next();
				// addRow(sf,ente, null, s);
				// }
			} catch (ServiceException e) {
				log.error("[InserisciInfoAssEnteService::execute]  "
						+ e.getMessage(), e);
				throw new WebServiceException(e.getMessage());
			}
			sf.getDirezioniLibereInserite().clear();
			sf.getSettoriLiberiInseriti().clear();
			sf.getRequest().getSession(false).setAttribute("schedaForm", sf);
			break;
		case SchedaForm.ALTRI_ENTI:
			inserimentoStandard_AltriEnti(sf,mode);

			break;
		}
		return sf;
	}

	/**
	 * @param sf
	 * @param mode 
	 * @param tabInfo
	 * @throws WebServiceException
	 */
	private void inserimentoStandard_AltriEnti(SchedaForm sf, int mode)
			throws WebServiceException {
		Ente ente = loadEnte(sf.getIdEnte());
		Direzione direzione = loadDirezione(sf.getProgressivoDirezione());
		Settore settore = loadSettore(sf.getProgressivoSettore());
		addRow(sf, ente, direzione, settore,mode);
	}

	/**
	 * @param sf
	 * @param tabInfo
	 * @param ente
	 * @param direzione
	 * @param settore
	 * @param mode tipo di inserimento (STANDARD=1, NON_STANDARD=2, ALTRI_ENTI=3)
	 */
	private void addRow(SchedaForm sf, Ente ente, Direzione direzione,
			Settore settore,int mode) {
		EntiSchedaContainer container = sf.getTabellaInformazioniAssEnte();
		String type="";
		switch(mode){
		case 1:
			type=EntiSchedaContainer.STANDARD;
			break;
		case 2:
			type=EntiSchedaContainer.NON_STANDARD;
			break;
		case 3:
			type=EntiSchedaContainer.ALTRI_ENTI;
			break;
		}
		Collection listaDirSett = container.get(ente, type);
		if (listaDirSett == null) {
			listaDirSett = new ArrayList();
		}
		EnteScheda es = new EnteScheda();
		es.setEmail1(sf.getEmail1());
		es.setEmail2(sf.getEmail2());
		es.setEmail3(sf.getEmail3());
		es.setWebsite1(sf.getSito1());
		es.setWebsite2(sf.getSito2());
		es.setWebsite3(sf.getSito3());
		es.setAltreInfo(sf.getAltreInfoAssEnte());
		es.setNote(sf.getNoteAssEnte());
		es.setModalitaInserimento(sf.getModalitaInserimento());
		es.setEnte(ente);
		if (direzione != null) {
			es.setDirezione(direzione);
		}
		if (settore != null) {
			es.setSettore(settore);
		}
		container.add(ente, es, type);
		sf.setTabellaInformazioniAssEnte(container);
		// for (Iterator iterator = tabInfo.iterator(); iterator.hasNext();) {
		// EnteScheda enteScheda= (EnteScheda) iterator.next();
		// if(enteScheda.getDescrizioneEstesa().equals(es.getDescrizioneEstesa())){
		// add=false;
		// break;
		// }
		// }
		// if(add){
		// tabInfo.add(es);
		//			
		// }
	}

	private Settore loadSettore(String progressivoSettore)
			throws WebServiceException {
		try {
			FinregioService s = new ServiceLocator().getFinRegioService();
			if (progressivoSettore == null
					|| progressivoSettore.trim().equals("-1")) {
				return null;
			}
			Settore settore = s.getSettoreByProgressivo(progressivoSettore);
			return settore;
		} catch (ServiceException e) {
			log.error("[InserisciInfoAssEnteService::loadEnte]  "
					+ e.getMessage(), e);
			throw new WebServiceException(e.getMessage());
		}
	}

	private Direzione loadDirezione(String progDirezione)
			throws WebServiceException {
		try {
			FinregioService s = new ServiceLocator().getFinRegioService();
			if (progDirezione == null || progDirezione.trim().equals("-1")) {
				return null;
			}
			Direzione direzione = s.getDirezioneByProgressivo(progDirezione);
			return direzione;
		} catch (ServiceException e) {
			log.error("[InserisciInfoAssEnteService::loadEnte]  "
					+ e.getMessage(), e);
			throw new WebServiceException(e.getMessage());
		}
	}

	private Ente loadEnte(String idEnte) throws WebServiceException {
		log.info("[InserisciInfoAssEnteService::loadEnte] BEGIN");
		try {
			FinregioService s = new ServiceLocator().getFinRegioService();
			if (idEnte == null || idEnte.trim().equals("")) {
				return null;
			}
			Ente ente = s.getEnteByPK(idEnte);
			return ente;
		} catch (ServiceException e) {
			log.error("[InserisciInfoAssEnteService::loadEnte]  "
					+ e.getMessage(), e);
			throw new WebServiceException(e.getMessage());
		} finally {
			log.info("[InserisciInfoAssEnteService::loadEnte] END");
		}
	}

}
